package beans.administrador;

import java.util.Collections;
import java.util.List;
import javax.faces.component.UICommand;
import javax.faces.model.SelectItem;
import javax.persistence.EntityExistsException;
import javax.persistence.Query;
import javax.persistence.EntityManager;
import javax.persistence.Persistence;
import javax.persistence.PersistenceContext;
import pojo.administrador.Regra;
import pojo.administrador.Usuario;

public class UsuarioBean {

    @PersistenceContext
    private EntityManager mgr;

    private long id;
    private String nome;
    private String login;
    private String senha;
    private Regra regra;
    
    private String regraSelecionado;
    private SelectItem dadosRegra[];
    private List<Usuario> listaUsuarios;
    
    private UICommand btnAlterar;
    private UICommand btnExcluir;

    private void carregaRegra() {
        dadosRegra = new SelectItem[3];
        dadosRegra[0] = new SelectItem("ADMINISTRADOR", "ADMINISTRADOR");
        dadosRegra[1] = new SelectItem("FINANCEIRO", "FINANCEIRO");
        dadosRegra[2] = new SelectItem("OPERACIONAL", "OPERACIONAL");
    }
    
    public UsuarioBean() {
        this.listaUsuarios = null;
        carregaRegra();
        carregar();
    }

    public String carregar() {
        listaUsuarios = Collections.EMPTY_LIST;
        mgr = Persistence.createEntityManagerFactory("lojaPU").createEntityManager();
        Query q1 = mgr.createNamedQuery("Usuario.listAll");
        listaUsuarios = q1.getResultList();
        mgr.close();
        return null;
    }
    
    public String pesquisar() {
        carregar();
        return "pesquisa";
    }
    
    public String salvar() {
        Usuario u = new Usuario();
        Regra r = new Regra();

        u.setNome(nome);
        u.setLogin(login);
        u.setSenha(senha);

        if (id != 0) {
            u.setId(id);

            mgr = Persistence.createEntityManagerFactory("lojaPU").createEntityManager();
            Query q1 = mgr.createNamedQuery("Regra.getByLogin");
            q1.setParameter("login", login);
            r = (Regra) q1.getSingleResult();
            r.setNome(regraSelecionado);
            r.setUsuario(u);

            mgr.getTransaction().begin();
            mgr.merge(u);
            mgr.getTransaction().commit();
        } else {
            r.setNome(regraSelecionado);
            r.setUsuario(u);
        }

        u.setRegra(r);

        mgr = Persistence.createEntityManagerFactory("lojaPU").createEntityManager();
        mgr.getTransaction().begin();
        try {
            if (u.getId() == 0)
                mgr.persist(u);
            else
                mgr.merge(u);
        }catch (EntityExistsException e){
            mgr.getTransaction().rollback();
        }finally {
            mgr.getTransaction().commit();
            mgr.close();
        }

        carregar();
                
        return "pesquisa";
    }

    public String excluir() {
        mgr = Persistence.createEntityManagerFactory("lojaPU").createEntityManager();
        Usuario u = mgr.find(Usuario.class, Long.parseLong(btnExcluir.getValue().toString()));

        mgr.getTransaction().begin();
        mgr.remove(u);
        mgr.getTransaction().commit();
        mgr.close();
        
        carregar();
        
        return null;
    }
    
    public String incluir() {
        id = 0;
        nome = "";
        login = "";
        senha = "";
        regraSelecionado = "";
        
        return "cadastro";
    }

    public String alterar() {
        mgr = Persistence.createEntityManagerFactory("lojaPU").createEntityManager();
        Usuario u = mgr.find(Usuario.class, Long.parseLong(btnAlterar.getValue().toString()));
        id = u.getId();
        nome = u.getNome();
        login = u.getLogin();
        senha = u.getSenha();
        regraSelecionado = u.getRegra().getNome();
        
        return "cadastro";
    }
    
    // Getters and Setters
    public UICommand getBtnAlterar() {
        return btnAlterar;
    }

    public void setBtnAlterar(UICommand btnAlterar) {
        this.btnAlterar = btnAlterar;
    }

    public UICommand getBtnExcluir() {
        return btnExcluir;
    }

    public void setBtnExcluir(UICommand btnExcluir) {
        this.btnExcluir = btnExcluir;
    }

    public SelectItem[] getDadosRegra() {
        return dadosRegra;
    }

    public void setDadosRegra(SelectItem[] dadosRegra) {
        this.dadosRegra = dadosRegra;
    }

    public long getId() {
        return id;
    }

    public void setId(long id) {
        this.id = id;
    }

    public List<Usuario> getListaUsuarios() {
        return listaUsuarios;
    }

    public void setListaUsuarios(List<Usuario> listaUsuarios) {
        this.listaUsuarios = listaUsuarios;
    }

    public String getLogin() {
        return login;
    }

    public void setLogin(String login) {
        this.login = login;
    }

    public String getNome() {
        return nome;
    }

    public void setNome(String nome) {
        this.nome = nome;
    }

    public Regra getRegra() {
        return regra;
    }

    public void setRegra(Regra regra) {
        this.regra = regra;
    }

    public String getRegraSelecionado() {
        return regraSelecionado;
    }

    public void setRegraSelecionado(String regraSelecionado) {
        this.regraSelecionado = regraSelecionado;
    }

    public String getSenha() {
        return senha;
    }

    public void setSenha(String senha) {
        this.senha = senha;
    }
}